package pl.wroc.pwr.mss.server.ui;

import java.awt.Container;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

import net.infonode.gui.laf.InfoNodeLookAndFeel;
import net.miginfocom.swing.MigLayout;

import org.apache.log4j.Logger;

import pl.wroc.pwr.mss.server.ui.dialogs.JPlaylistEditDialog;
import pl.wroc.pwr.mss.server.ui.menu.JCreatePlaylistMenuItem;
import pl.wroc.pwr.mss.server.ui.menu.JExitMenuItem;
import pl.wroc.pwr.mss.server.ui.tables.JPlaylistTable;
import pl.wroc.pwr.mss.server.ui.tables.JSongTable;
import pl.wroc.pwr.mss.server.ui.tables.models.PlaylistTableModel;
import pl.wroc.pwr.mss.server.util.JTableUtils;

/**
 * Graficzny interfejs aplikacji serwerowej.
 * 
 * @author mjagus
 */
public class ServerGui extends JFrame
{
    /**
     * Identyfikator klasy.
     */
    private static final long serialVersionUID = 3259323746406502156L;

    /**
     * Logger tej klasy.
     */
    private static final Logger log = Logger.getLogger(ServerGui.class);

    /**
     * Nazwa okna aplikacji serwerowej.
     */
    private static final String APPLICATION_NAME = "Music Streaming System 1.0";

    /**
     * Przycisk z menu rozwijanego otwierajacy okno tworzenia nowej playlisty.
     */
    private JCreatePlaylistMenuItem createPlaylistMenuItem;

    /**
     * Przycisk z menu rozwijanego zamykajacy aplikacje.
     */
    private JExitMenuItem exitMenuItem;

    /**
     * Tabela wyswietlajaca nazwy wszystkich playlist.
     */
    private JPlaylistTable playlistTable;

    /**
     * Tabela wyswietlajaca dane wszystkich utworow znajdujacych sie na
     * wybranej playliscie.
     */
    private JSongTable songTable;

    /**
     * Okno dialogowe do edycji/tworzenia playlist.
     */
    private JPlaylistEditDialog playlistEditDialog;

    static {
        try {
            UIManager.setLookAndFeel(new InfoNodeLookAndFeel());
        } catch(UnsupportedLookAndFeelException e) {
            log.warn(e);
        }
    }

    /**
     * Iniciuje okno aplikacji serwerowej.
     */
    public ServerGui()
    {
        super(APPLICATION_NAME);

        super.setSize(800, 600);
        super.setLocationRelativeTo(null);
        super.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }

    /**
     * Iniciuje komponenty tego okna.
     */
    public void initComponents()
    {
        Container pane = super.getContentPane();
        pane.setLayout(new MigLayout());

        JMenuBar menuBar = new JMenuBar();
        JMenu fileMenu = new JMenu("File");

        fileMenu.add(createPlaylistMenuItem);
        fileMenu.addSeparator();
        fileMenu.add(exitMenuItem);
        menuBar.add(fileMenu);
        super.setJMenuBar(menuBar);

        JSplitPane splitPane = new JSplitPane();
        splitPane.setLeftComponent(new JScrollPane(playlistTable));
        splitPane.setRightComponent(new JScrollPane(songTable));
        splitPane.setDividerLocation(150);
        pane.add(splitPane, "width 100%, height 100%, wrap");

        ((PlaylistTableModel)playlistTable.getModel()).fireTableDataChanged();
        JTableUtils.adjustColumns(playlistTable);
    }

    /**
     * @return Przycisk z menu rozwijalnego otwierajacy okno tworzena nowej
     * playlisty
     */
    public JCreatePlaylistMenuItem getCreatePlaylistMenuItem()
    {
        return createPlaylistMenuItem;
    }

    /**
     * @return Przycisk z menu rozwijalnego zamykajacy aplikacje
     */
    public JExitMenuItem getExitMenuItem()
    {
        return exitMenuItem;
    }

    /**
     * @return Tabela playlist
     */
    public JPlaylistTable getPlaylistTable()
    {
        return playlistTable;
    }

    /**
     * @return Tabela utworow
     */
    public JSongTable getSongTable()
    {
        return songTable;
    }

    /**
     * @return Okno dialogowe do edycji/tworzenia playlist.
     */
    public JPlaylistEditDialog getPlaylistEditDialog()
    {
        return playlistEditDialog;
    }

    /**
     * @param createPlaylistMenuItem Przycisk do tworzenia nowej playlisty
     */
    public void setCreatePlaylistMenuItem(JCreatePlaylistMenuItem createPlaylistMenuItem)
    {
        this.createPlaylistMenuItem = createPlaylistMenuItem;
    }

    /**
     * @param exitMenuItem Przycisk do zamykania aplikacji
     */
    public void setExitMenuItem(JExitMenuItem exitMenuItem)
    {
        this.exitMenuItem = exitMenuItem;
    }

    /**
     * @param playlistTable Tabela z playlistami
     */
    public void setPlaylistTable(JPlaylistTable playlistTable)
    {
        this.playlistTable = playlistTable;
    }

    /**
     * @param songTable Tabela z utworami
     */
    public void setSongTable(JSongTable songTable)
    {
        this.songTable = songTable;
    }

    /**
     * @param playlistEditDialog Okno dialogowe do edycji/tworzenia playlist
     */
    public void setPlaylistEditDialog(JPlaylistEditDialog playlistEditDialog)
    {
        this.playlistEditDialog = playlistEditDialog;
    }
}
